// packageA/pages/staffLocation/staffLocation.js
const app = getApp();
import CommonService from '../../../utils/service/commonService.js';
import Toast from '../../../miniprogram_npm/@vant/weapp/toast/toast';

Page({

  /**
   * 页面的初始数据
   */
  data: {
    //地区中心点-纬度
    latitude: '',
    //地区中心点-经度
    longitude: '',
    //地图上标记
    markers:[],
    //人员定位列表
    list:[],
    //在线人员列表
    onLineList: [],
    //离线人员列表
    offLineList: [],
    //显示人员信息
    showInfo:false,
    //人员信息
    info:{},
    //人员定位信息
    imeiInfo:{},
    //定位地址
    address:'',
    //传参
    paramObj:null,
    //是查单人还是部门
    isOne: false,
    //圆
    circles:[],
    //多边形
    polygons: [],
    //权限
    authority: null,
    //显示人员列表
    showList: false,
    //人员列表数据
    staffList: [],
    //显示人员信息按钮
    showBtn: false,

    //项目选择框
    showProject:false,
    //项目选择数据
    projectList:[],
    //项目id
    projectId:null,
    //项目名称
    projectName:'选择部门',
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    this.setData({
      authority: app.globalData.authority
    })

    if(options.paramObj){
      let paramObj=JSON.parse(options.paramObj);
      console.log('人员定位传参');
      console.log(paramObj);

      this.setData({
        paramObj: paramObj,
        isOne: true
      })

      //获取人员信息
      this.getInfo(paramObj.imei);

    }else{
      //获取人员列表
      this.getList();
    }
  },

  //获取人员列表
  getList(){
    Toast.loading({
      duration: 0,
      forbidClick: true,
      message: '加载中...'
    });

    let param={};

    //查询某个部门
    if(this.data.projectId){
      param.depart = [this.data.projectId];
    }

    //员工查询
    let authority = this.data.authority;

    if(authority.manage.userCard.staff){
      this.setData({
        isOne: true
      })
      let user = app.globalData.userInfo;
      param.imei = user.imei ? [user.imei] : null;
    }else{
      this.setData({
        isOne: false
      })
    }

    CommonService.findPersonnelAll(param).then(res => {
      if(res.data.data && res.data.data.result && res.data.data.result.length) {
        Toast.clear();
        let result=res.data.data.result;
        let arr=[],onLine=[],offLine=[];

        console.log('人员列表');
        console.log(result);

        result.forEach(item => {
          if (item.lat && item.lon){
            arr.push(item);
          }

          //在线离线（这个页面有两个地方计算，修改时注意别漏了）
          if(item.ctm){
            //这里时间是TZ格式，但实际是北京时间，不能直接newDate
            let times=item.ctm.replaceAll('-','/');
            times=times.replaceAll('T',' ');
            times=times.substring(0,19);

            let at=new Date(times);
            let currentTime=new Date();
            let num=currentTime-at;

            //30分钟为离线
            if(num>30*60*1000){
              item.self_onLine=false;
              offLine.push(item);
            }else{
              item.self_onLine=true;
              onLine.push(item);
            }
          }else{
            item.self_onLine=false;
            offLine.push(item);
          }
        });

        this.setData({
          list: arr,
          onLineList: onLine,
          offLineList: offLine
        })

        //显示标注
        this.showMarkers(arr);
      }else{
        Toast.fail('暂无人员信息');
        this.setData({
          latitude: '39.898331',
          longitude: '116.411168'
        })
      }
    }).catch((error) => {
      Toast.fail('暂无人员信息');
      this.setData({
        latitude: '39.898331',
        longitude: '116.411168'
      })
    })
  },

  //获取人员信息
  getInfo(imei){
    let param = {
      imei: imei
    }

    CommonService.findPersonnel(param).then(res => {
      if(res.data.data && res.data.data.result && res.data.data.result) {
        let result=res.data.data.result;
        console.log('人员信息');
        console.log(result);

        if(result.lat && result.lon){
          //在线离线（这个页面有两个地方计算，修改时注意别漏了）
          if(result.ctm){
            //这里时间是TZ格式，但实际是北京时间，不能直接newDate
            let times=result.ctm.replaceAll('-','/');
            times=times.replaceAll('T',' ');
            times=times.substring(0,19);

            let at=new Date(times);
            let currentTime=new Date();
            let num=currentTime-at;

            //30分钟为离线
            if(num>30*60*1000){
              result.self_onLine=false;
            }else{
              result.self_onLine=true;
            }
          }else{
            result.self_onLine=false;
          }

          this.setData({
            list: [result]
          })

          //显示标注
          this.showMarkers();

          //地理位置解析
          this.locationAnalysis(result);

        }else{
          Toast.fail('暂无定位信息');

          //如果有围栏就定位在围栏，没有则定位到默认点
          if(result.fence && result.fence.length){
            this.setData({
              latitude: result.fence[0].points[0].latitude,
              longitude: result.fence[0].points[0].longitude
            })
          }else{
            this.setData({
              latitude: '39.898331',
              longitude: '116.411168'
            })
          }
        }

        this.setData({
          showInfo: true,
          showBtn: false,
          info: result
        })

        //显示围栏
        if(result.fence && result.fence.length){
          this.showFence(result.fence);
        }
      }else{
        Toast.fail('暂无定位信息');
        this.setData({
          showInfo: false,
          latitude: '39.898331',
          longitude: '116.411168'
        })
      }
    }).catch(() => {
      Toast.fail('暂无定位信息');
      this.setData({
        showInfo: false,
        latitude: '39.898331',
        longitude: '116.411168'
      })
    })
  },

  //显示标注
  showMarkers(list){
    let arr=[];
    if(list){
      arr=list;
    }else{
      arr=this.data.list;
    }

    console.log('人员标记');
    console.log(arr);

    let markers=[];
    let onImg='http://bangnizu.oss-cn-hangzhou.aliyuncs.com/bangni/images1/map.png';
    let offImg='http://bangnizu.oss-cn-hangzhou.aliyuncs.com/bangni/images1/map-2.png';

    arr.forEach(item => {
      if(item.self_onLine){
        markers.push({
          id:Number(item.imei),
          latitude: item.lat,
          longitude: item.lon,
          iconPath: onImg
        })
      }else{
        markers.push({
          id:Number(item.imei),
          latitude: item.lat,
          longitude: item.lon,
          iconPath: offImg
        })
      }
    });

    this.setData({
      markers: markers,
      latitude: markers[0].latitude,
      longitude: markers[0].longitude,
    })

    //地图自适应缩放
    this.mapAdapt(markers);
  },

  //点击标注
  markertap(e){
    this.setData({
      latitude: null,
      longitude: null,
      isOne: true,
      showList: false
    })

    //获取人员信息
    this.getInfo(e.markerId+'');
  },

  //显示所有人员
  onShowAll(){
    this.setData({
      isOne: false,
      //隐藏底部信息
      showInfo: false,
      //清除围栏
      circles: [],
      polygons: [],
      list: [],
      onLineList: [],
      offLineList: [],
      showList: false,
      markers: null
    })

    //获取人员列表
    this.getList();
  },

  //逆地址解析
  locationAnalysis(info){
    let _this = this;
    let location = info.lat +','+ info.lon;
    let key = app.globalData.tencentKey;

    wx.request({
		  url: 'https://apis.map.qq.com/ws/geocoder/v1/?location='+location+'&key='+key+'&get_poi=1',
		  method: "GET",
		  success(res) {
        if(res.statusCode==200 && res.data){
          _this.setData({
            address: res.data.result.address
          })  
        }
		  }
    })
  },

  //跳转员工资料
  goToInfo(){
    let obj={
      id: this.data.info.id
    }

    wx.navigateTo({
      url: "/packageA/pages/staffInfo/staffInfo?paramObj="+JSON.stringify(obj)
    })
  },

  //跳转员工轨迹
  goToTrajectory(){
    let detail=this.data.info;
    let paramObj={
      nickName:detail.nickName,
      lon:detail.lon,
      lat:detail.lat,
      imei:detail.imei
    }
    wx.navigateTo({
			url: "/packageA/pages/staffTrajectory/staffTrajectory?paramObj="+JSON.stringify(paramObj)
		})
  },

  //立即定位
  goToImmediatelyLocate(){
    Toast.loading({
      duration: 0,
      forbidClick: true,
      message: '加载中...'
    });
    let detail=this.data.info;
    console.log(detail);
    //发送指令
    let immediatelyLocateInstructions = {
          "url":"/sendDeviceInstructions",
          "body":{
              "imei":detail.imei,
              "command":128
          }
      }
      console.log(immediatelyLocateInstructions);
     CommonService.sendInstruction(immediatelyLocateInstructions).then(res=>{
        console.log(res);
        Toast.clear();
        if(res.data && res.data.status == 1){
          Toast.success('操作成功');
          //获取人员信息
          this.getInfo(detail.imei);
        }
    })
  },


  //跳转步数统计
  goToStep(){
    let detail=this.data.info;

    let obj={
      imei: detail.imei,
      nickName: detail.nickName
    }

    wx.navigateTo({
      url: "/packageA/pages/stepChart/stepChart?paramObj="+JSON.stringify(obj)
    })
  },

  //显示围栏
  showFence(fences){
    console.log('围栏信息');
    console.log(fences);

    let circles=[];
    let polygons=[];

    fences.forEach(item => {
		  if(item.type==1){
        //圆形
        circles.push({
          color: '#1989FA',
          fillColor: '#1989FA50',
          radius: item.radius,
          strokeWidth: 1,
          latitude: item.points[0].latitude,
          longitude: item.points[0].longitude
        });
		  }else if(item.type==2){
        //多边形
        polygons.push({
          dashArray:[0, 0],
          points: item.points,
          strokeWidth: 1,
          strokeColor: "#FF0000",
          fillColor: "#FF000050"
        })
      }
    });

    this.setData({
      circles: circles,
      polygons: polygons
    })
  },

  //显示人员列表
  onShowStaffList(e){
    let dataset=e.currentTarget.dataset;
    let list=this.data[dataset.detail];
    if(list.length){
      this.setData({
        showList: true,
        staffList: list,
        listWord: dataset.word,
        showInfo: false
      })
    }

    this.showMarkers(list);
  },

  //点击人员
  onShowLocation({currentTarget}){
    let imei=currentTarget.dataset.imei;
    //获取人员信息
    this.getInfo(imei);
  },

  //隐藏人员信息
  onCloseInfo(){
    this.setData({
      showInfo: false,
      showBtn: true
    })
  },

  //显示人员信息
  onShowInfo(){
    this.setData({
      showInfo: true,
      showBtn: false
    })
  },

  //隐藏人员列表
  onCloseList(){
    this.setData({
      showList: false
    })
  },

  //显示项目
  onShowProject(){
    this.setData({
			showProject: true
    })
    this.getProjectList();
  },

  //查询项目
  getProjectList(){
    this.setData({
      projectList: []
    })

    let param = {
      isAuth: true,
      className: 'depart',
      data: {
        searchAll: true,
        selectFields: ['id','name']
      }
    }

    //模糊查询
    if(this.data.valueSearchProject){
      param.data.name='%' + this.data.valueSearchProject + '%';
    }

    CommonService.goFindList(param).then(res=>{
      if(res.data.data && res.data.data.result && res.data.data.result.length){
        let result=res.data.data.result;
        let arr=[];

        result.forEach(item => {
          arr.push({
            text:item.name,
            id:item.id
          });
        });

        this.setData({
          projectList: arr
        })
      }
    }).catch((error) => {
    })
  },

  //隐藏项目
  onCloseProject(){
    this.setData({
      showProject: false,
      valueSearchProject:''
    })
  },

  //确认项目
  onConfirmProject(e){
    this.setData({
      projectId:e.detail.value.id,
      projectName:e.detail.value.text
    })
    this.onCloseProject();

    //获取人员
    this.onShowAll();
  },

  //搜索项目
  onChangeProjectVal(e){
    this.setData({
      valueSearchProject: e.detail
    })
    this.getProjectList();
  },

  //地图自适应缩放
  mapAdapt(markers){
    let map=wx.createMapContext('map');
    map.includePoints({
      points: markers
    });
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  }
})
